Path Traversal
別名: Directory Traversal
誤ったファイルパスの取り扱いを利用して、プログラムが想定していないファイルを処理させる脆弱性
典型的には、../../../../etc/passwdや/etc/passwdを入力して/etc/passwdを処理させるような攻撃
例
典型的なPath Traversalである
対策
パスからファイル名だけを取り出して扱うようにする
多くのユースケースではこれで十分
Python os.path.basename
パスを検証する
想定していない相対パスや絶対パスであるかどうかを調べる
Windowsではスラッシュは\だったり、C:でドライブ指定できたりするので環境による挙動の違いに注意
末尾のスラッシュにも注意
/fooというディレクトリがあり、先頭が/fooで始まっているかでチェックしている場合、/fooabcのようなパスが通るので注意
パスを検証した後に処理を加えないこと
例えばパスを検証した後にURL Decodeがされる場合、%2E%2E%2Fでチェックを回避できる
脆弱性を作りこみやすいので注意
テクニック
全体の../が一回だけ削除される場合
..././を入れると削除後に../になる
..が削除される場合は多分無理
nginx
alias traversal
誤った設定のaliasがあると、上のディレクトリにさかのぼれる可能性がある
nginxでは/より前にさかのぼるパスは弾かれる
/cgi-bin/../../etc/passwdのようなパスはBad Requestになる
merge_slashes off;のときは//////cgi-bin/../../etc/passwdのようにすれば回避できる
この挙動の詳細な解説が載っている
ヌルバイト攻撃
シンボリックリンクの悪用
Python os.path.join
os.path.join("./aaa", "/bbb")は/bbbを返す
os.path.normpath
TODO CVE入れる
Exploit関連
Path Traversalで任意のテンプレートをrenderできるときなど、都合のいいファイルをサーバーに置きたいときがある
Webサーバーの機能の悪用
nginxやapacheなどで生成されるログファイルを利用して攻撃者が指定した文字列を含むファイルを作れる場合がある
セッション情報が保存されるファイルや、ファイルアップロードの際に生成される一時ファイルも悪用できる
TODO: 1linephpのやつ貼る
LFI時にファイルがcloseされてなければ、ファイル名がわからなくても/proc/self/fd/Xが利用できる
Flaskの一時ファイルを利用
資料